package com.konsung.util;

import android.text.TextUtils;
import java.util.regex.Pattern;

/**
 * Created by lipengjie on 2016/9/28 0028.
 * 字符串处理的工具类
 */
public class StringUtil {

    /**
     * main方法
     * @param args 字符串数组
     */
    public static void main(String[] args) {
        System.out.println("0.85" + isWaist("0.85"));
        System.out.println("100.855" + isWaist("100.855"));
        System.out.println("1001.85" + isWaist("1001.85"));
        System.out.println("100.8" + isWaist("100.8"));
        System.out.println("10.85" + isWaist("10.85"));
        System.out.println("10" + isWaist("10"));
    }

    /**
     * 是否都是数字
     */
    public static final String NUMBER = "^[0-9xX]{1,18}$";

    /**
     * 当姓名大于=6位数,只显示前五个字第六个字的时候用“...”表示
     *
     * @param name 群名称
     * @return 省略后的字符串
     */
    public static String stringOmit(String name) {
        StringBuffer buffer = new StringBuffer();
        if (name.length() >= 6) {
            String oldSub = name.substring(0, 5);
            buffer.append(oldSub);
            buffer.append("....");
        } else {
            buffer.append(name);
        }
        return buffer.toString();
    }

    /**
     * 删除浮点数字符串尾数后的0或者小数点
     *
     * @param numStr 待处理的数字字符串
     * @return 处理后的数字字符串
     */
    public static String deleteEnd0(String numStr) {

        if (numStr != null && numStr.length() > 0) {
            if (numStr.contains(".")) { //包含小数点则为浮点数
                if (numStr.endsWith("0")) {
                    return deleteEnd0(numStr.substring(0, numStr.length() - 1));
                } else if (numStr.endsWith(".")) {
                    return numStr.substring(0, numStr.length() - 1);
                }
            }
        }
        return numStr;
    }

    /**
     * 获取有效int值（null会返回-1）
     *
     * @param string 字符串数据
     * @return 获取有效字符串
     */
    public static Integer getValidInt(String string) {
        if (TextUtils.isEmpty(string)) {
            return -1;
        }
        return Integer.valueOf(string);
    }

    /**
     * 获取有效字符串（null会返回空字符串）
     *
     * @param string 字符串数据
     * @return 获取有效字符串
     */
    public static String getValidStr(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        return string;
    }

    /**
     * 座机电话格式验证
     **/
    private static final String PHONE_CALL_PATTERN = "^(0[0-9]{2,3})?([2-9][0-9]{6,7})+([0-9]{1," +
            "4})?$";

    /**
     * 中国电信号码格式验证 手机段： 133,153,180,181,189,177,1700,173
     **/
    private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|53|7[37]|8[019])" +
            "\\d{8}$)|(?:^(?:\\+86)?1700\\d{7}$)";

    /**
     * 中国联通号码格式验证 手机段：130,131,132,155,156,185,186,145,176,1707,1708,1709,175
     **/
    private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1" +
            "(?:3[0-2]|4[5]|5[56]|7[56]|8[56])\\d{8}$)|(?:^(?:\\+86)?170[7-9]\\d{7}$)";
    /**
     * 简单手机号码校验，校验手机号码的长度和1开头
     */
    private static final String SIMPLE_PHONE_CHECK = "^(?:\\+86)?1\\d{10}$";
    /**
     * 中国移动号码格式验证
     * 手机段：134,135,136,137,138,139,150,151,152,157,158,159,182,183,184
     * ,187,188,147,178,1705
     **/
    private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1" +
            "(?:3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(?:^(?:\\+86)?1705\\d{7}$)";


    /**
     * 检测身高，体重，腰围，体温数字是否符合 xxx.xx 格式（整数3位，小数两位）
     */
    private static final String WAIST_CHECK = "^([0-9]{1,3}[.][0-9]{0,2})$";

    /**
     * 仅手机号格式校验
     */
    private static final String PHONE_PATTERN = new StringBuilder(300)
            .append(CHINA_MOBILE_PATTERN).append("|")
            .append(CHINA_TELECOM_PATTERN).append("|")
            .append(CHINA_UNICOM_PATTERN).toString();

    /**
     * 手机和座机号格式校验
     */
    private static final String PHONE_TEL_PATTERN = new StringBuilder(350)
            .append(PHONE_PATTERN).append("|").append("(")
            .append(PHONE_CALL_PATTERN).append(")").toString();

    /**
     * 匹配多个号码以,、或空格隔开的格式，如 17750581369
     * 13306061248、(596)3370653,17750581369,13306061248 (0596)3370653
     *
     * @param input     input
     * @param separator 可以自己指定分隔符，如"、, "表示可以以顿号、逗号和空格分隔
     * @return 匹配是否成功
     */
    public static boolean checkMultiPhone(String input, String separator) {
        separator = escapeMetacharacterOfStr(separator);
        String regex = "^(?!.+["
                + separator
                + "]$)(?:(?:(?:(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?)|(?:1\\d{10}))" +
                "(?:["
                + separator + "]|$))+$";
        return match(regex, input);
    }

    /**
     * 转义字符串中的[]-^\元字符
     *
     * @param input input
     * @return 字符
     */
    private static String escapeMetacharacterOfStr(String input) {
        String regex = "[-^\\[\\]\\\\]";
        return input.replaceAll(regex, "\\\\$0");
    }

    /**
     * 仅手机号码校验
     *
     * @param input input
     * @return 仅手机号码校验
     */
    public static boolean isPhone(String input) {
        return match(PHONE_PATTERN, input);
    }

    /**
     * 手机号或座机号校验
     *
     * @param input input
     * @return isPhoneOrTel
     */
    public static boolean isPhoneOrTel(String input) {
        System.out.println(PHONE_TEL_PATTERN);
        return match(PHONE_TEL_PATTERN, input);
    }

    /**
     * 验证电话号码的格式
     *
     * @param str 校验电话字符串
     * @return 返回true, 否则为false
     * @author LinBilin
     */
    public static boolean isPhoneCallNum(String str) {
        return match(PHONE_CALL_PATTERN, str);
    }

    /**
     * 验证【电信】手机号码的格式
     *
     * @param str 校验手机字符串
     * @return 返回true, 否则为false
     * @author LinBilin
     */
    public static boolean isChinaTelecomPhoneNum(String str) {
        return match(CHINA_TELECOM_PATTERN, str);
    }

    /**
     * 验证【联通】手机号码的格式
     *
     * @param str 校验手机字符串
     * @return 返回true, 否则为false
     * @author LinBilin
     */
    public static boolean isChinaUnicomPhoneNum(String str) {
        return match(CHINA_UNICOM_PATTERN, str);
    }

    /**
     * 验证【移动】手机号码的格式
     *
     * @param str 校验手机字符串
     * @return 返回true, 否则为false
     * @author LinBilin
     */
    public static boolean isChinaMobilePhoneNum(String str) {
        return match(CHINA_MOBILE_PATTERN, str);
    }

    /**
     * 简单手机号码校验，校验手机号码的长度和1开头
     *
     * @param str str
     * @return 简单手机号码校验
     */
    public static boolean isPhoneSimple(String str) {
        return match(SIMPLE_PHONE_CHECK, str);
    }

    /**
     * 检测身高，体重，腰围，体温数字是否符合 xxx.xx 格式（整数3位，小数两位）
     *
     * @param str 输入数据
     * @return 检测身高，体重，腰围，体温数字是否符合 xxx.xx 格式（整数3位，小数两位）
     */
    public static boolean isWaist(String str) {
        return match(WAIST_CHECK, str);
    }

    /**
     * 匹配函数
     *
     * @param regex regex
     * @param input input
     * @return 是否匹配
     */
    public static boolean match(String regex, String input) {
        return Pattern.matches(regex, input);
    }

    /**
     * @param str str
     * @return isEmpty
     */
    public static boolean isEmpty(String str) {
        if (TextUtils.isEmpty(str) || str.equals("null")) {
            return true;
        } else if (str.replaceAll(" ", "").length() == 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取一个字符串有多少个中文字符
     *
     * @param str 字符串
     * @return 中文字符个数
     */
    public static int getChineseNumber(String str) {
        if (str != null && str.length() > 0) {
            String regex = "[\u4e00-\u9fff]";
            int count = (" " + str + " ").split(regex).length - 1;
            return count;
        } else {
            return 0;
        }
    }

    /**
     * 该方法专门用于性别数字转换，后台性别数字和app不一样，后台为了兼容其他版本，只能app做更改
     *
     * @param string 性别数字 1男 0女
     * @return 性别数字
     */
    public static Integer getValidIntInSex(String string) {
        if (TextUtils.isEmpty(string)) {
            return -1;
        }
        return Integer.valueOf(string);
    }


}